package lanqiao._02算法训练.page02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec
 * 资源限制
 * 内存限制：256.0MB   C/C++时间限制：1.0s   Java时间限制：3.0s   Python时间限制：5.0s
 * 问题描述
 * 　　南将军手下有N个士兵，分别编号1到N，这些士兵的杀敌数都是已知的。
 * 　　小工是南将军手下的军师，南将军经常想知道第m号到第n号士兵的总杀敌数，请你帮助小工来回答南将军吧。
 * 　　南将军的某次询问之后士兵i可能又杀敌q人，之后南将军再询问的时候，需要考虑到新增的杀敌数。
 * 输入格式
 * 　　多组测试数据，以EOF结尾；
 * 　　每组第一行是两个整数N,M，其中N表示士兵的个数(1<N<1000000)，M表示指令的条数。(1<M<100000)
 * 　　随后的一行是N个整数，ai表示第i号士兵杀敌数目。(0<=ai<=100)
 * 　　随后的M行每行是一条指令，这条指令包含了一个字符串和两个整数，首先是一个字符串，如果是字符串QUERY则表示南将军进行了查询操
 * 　　作，后面的两个整数m,n，表示查询的起始与终止士兵编号；如果是字符串ADD则后面跟的两个整数I,A(1<=I<=N,1<=A<=100),表示第I个士兵新增杀敌数为A.
 * 输出格式
 * 　　对于每次查询，输出一个整数R表示第m号士兵到第n号士兵的总杀敌数，每组输出占一行
 * 样例输入
 * 5 6
 * 1 2 3 4 5
 * QUERY 1 3
 * ADD 1 2
 * QUERY 1 3
 * ADD 2 3
 * QUERY 1 2
 * QUERY 1 5
 * 样例输出
 * 6
 * 8
 * 8
 * 20
 * 思路：
 * 前缀和
 * 注意士兵的编号从1开始
 * 多组测试数据，以EOF结尾：
 * 如果使用Scanner,可以使用hasNext方法判断是否输入结束
 * 如果使用BufferedReader，使用字符串接受如果为null则输入结束
 * 使用BufferedReader 大数据输入时更快，数据很多时Scanner可能超时。
 * @since 2022 - 11 - 04 - 22:05
 */
public class _14士兵杀敌 {
}

class Main14{
    //nums[i]记录 i号 士兵的杀敌数
    static int[] nums = new int[1000005];
    //sums[i] 1-i号 士兵杀敌数的和
    static int[] sums = new int[1000005];
    static int n;
    static int m;
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    //分词器
    static StringTokenizer token = new StringTokenizer("");
    static String next() throws IOException {
        if(!token.hasMoreTokens()){
            token = new StringTokenizer(reader.readLine());
        }
        return token.nextToken();
    }
    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public static void main(String[] args) throws IOException {
        String s;
        int n1, n2;
        //先读第一行，判断是否遇到EOF
        while((s = reader.readLine()) != null){
            String[] strs = s.split(" ");
            n = Integer.parseInt(strs[0]);
            m = Integer.parseInt(strs[1]);
            //累加前缀和
            for(int i = 1; i <= n; i++){
                nums[i] = nextInt();
                sums[i] = sums[i - 1] + nums[i];
            }
            //指令
            for(int j = 0; j < m; j++){
                s = next();
                n1 = nextInt();
                n2 = nextInt();
                if("QUERY".equals(s)){  //查询
                    System.out.println(sums[n2] - sums[n1 - 1]);
                }else{  //添加
                    //影响当前和之后的前缀和
                    for(int i = n1; i <= n; i++){
                        sums[i] += n2;
                    }
                }
            }
        }
    }
}

class Main14_1{
    //nums[i]记录 i号 士兵的杀敌数
    static int[] nums = new int[1000005];
    //sums[i] 1-i号 士兵杀敌数的和
    static int[] sums = new int[1000005];
    static int n;
    static int m;
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) throws IOException {
        String s;
        int n1, n2;
        while(sc.hasNext()){
            n = sc.nextInt();
            m = sc.nextInt();
            sums[0] = 0;
            //累加前缀和
            for(int i = 1; i <= n; i++){
                nums[i] = sc.nextInt();
                sums[i] = sums[i - 1] + nums[i];
            }
            //指令
            for(int j = 0; j < m; j++){
                s = sc.next();
                n1 = sc.nextInt();
                n2 = sc.nextInt();
                if("QUERY".equals(s)){//查询
                    System.out.println(sums[n2] - sums[n1 - 1]);
                }else{
                    //影响当前和之后的前缀和
                    for(int i = n1; i <= n; i++){
                        sums[i] += n2;
                    }
                }
            }
        }
    }
}